(function () {
  /**
   * 在定义函数或类时，如果遇到类型不明确就可以使用泛型
   */

  function fn<T>(a: T): T {
    return a;
  }

  fn(10); // 不指定泛型，TS自动对类型进行推断
  fn<string>("hello"); // 指定泛型

  // 泛型可以同时指定多个
  function fn1<T, K>(a: T, b: K): T {
    // console.log(b);
    return a;
  }

  fn1<number, string>(123, "abc");

  interface Inter {
    length: number;
  }

  // T extends Inter 表示泛型T必须是Inter的实现类（子类）
  function fn2<T extends Inter>(a: T): number {
    console.log(a.length);
    return a.length;
  }

  fn2("xiaoxu");

  class MyClass<T> {
    name: T;
    constructor(name: T) {
      this.name = name;
    }
  }

  const mc = new MyClass<string>("小徐");
  console.log(mc);
})();
